package modelo.persistencia.JDBC;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import modelo.entidades.AccesoImp;
import modelo.entidades.RegistroAcceso;
import modelo.entidades.RegistroAccesoImp;
import modelo.entidades.VehiculoImp;
import modelo.persistencia.RegistroAccesoDAO;

/**
 *
 * @author jjcamacho
 */
public class RegistroAccesoDAOJDBC implements RegistroAccesoDAO {

    @Override
    public RegistroAcceso read(String pk) throws SQLException, Exception {
        throw new UnsupportedOperationException("No implementado");
    }

    @Override
    public RegistroAcceso read(RegistroAcceso entidad) throws SQLException, Exception {
        //   throw new UnsupportedOperationException("No implementado");
        RegistroAcceso registro = null;
        String sql = "select * from registros_accesos where nombre=? and matricula=? and fecha_entrada=?";
        try {
            PreparedStatement stmt = Persistencia.createConnection().prepareStatement(sql);
            stmt.setString(1, entidad.getAcceso().getNombre());
            stmt.setString(2,entidad.getVehiculo().getMatricula());
            stmt.setTimestamp(3,entidad.getFechaEntrada());
            ResultSet res = stmt.executeQuery();
            if (res.next()) {
                String nombre = res.getString("nombre");
                String matricula = res.getString("matricula");
                Timestamp fechaEntrada = res.getTimestamp("fecha_entrada");
                Timestamp fechaSalida = res.getTimestamp("fecha_salida");
                registro = new RegistroAccesoImp(new VehiculoImp(matricula), new AccesoImp(nombre), fechaEntrada);
                registro.setFechaSalida(fechaSalida);
            }
        } finally {
            Persistencia.closeConnection();
        }
        return registro;
    }

    @Override
    public void create(RegistroAcceso registro) throws SQLException, Exception {
        String sql = "insert into registros_accesos(nombre, matricula, fecha_entrada) values (?,?,?)";
        try {
            PreparedStatement stm = Persistencia.createConnection().prepareStatement(sql);
            stm.setString(1, registro.getAcceso().getNombre());
            stm.setString(2, registro.getVehiculo().getMatricula());
            stm.setTimestamp(3, (Timestamp) registro.getFechaEntrada());

            stm.execute();
        } finally {
            Persistencia.closeConnection();
        }
    }

    @Override
    public void update(RegistroAcceso registro) throws SQLException, Exception {
        /* Debe tenerse cuidado con la definición de las tablas en la BD ya que
         * MySQL establece por defecto la actualización automática del campo
         * fecha_entrada de manera que queda con la misma fecha que la salida. */
        String sql = "update registros_accesos set fecha_salida=? " +
                "where nombre like ? and matricula like ? and fecha_salida is null";
        try {
            PreparedStatement stm = Persistencia.createConnection().prepareStatement(sql);
            stm.setTimestamp(1, (Timestamp) registro.getFechaSalida());
            stm.setString(2, registro.getAcceso().getNombre());
            stm.setString(3,registro.getVehiculo().getMatricula());

            stm.executeUpdate();
        } finally {
            Persistencia.closeConnection();
        }
    }

    @Override
    public void delete(RegistroAcceso registro) throws SQLException, Exception {
        String sql = "delete from registros_accesos where nombre = ? and matricula=? and fecha_entrada=?";
        try {
            PreparedStatement stm = Persistencia.createConnection().prepareStatement(sql);
            stm.setString(1, registro.getAcceso().getNombre());
            stm.setString(2, registro.getVehiculo().getMatricula());
            stm.setTimestamp(3, registro.getFechaEntrada());
            stm.execute();
        } finally {
            Persistencia.closeConnection();
        }
    }

    @Override
    public List<RegistroAcceso> list() throws SQLException, Exception {
        List<RegistroAcceso> registros = new ArrayList<RegistroAcceso>();

        try {
            Statement stmt = Persistencia.createConnection().createStatement();
            ResultSet res = stmt.executeQuery("select * from registros_accesos");
            while (res.next()) {
                String nombre = res.getString("nombre");
                String matricula = res.getString("matricula");
                Timestamp fechaEntrada = res.getTimestamp("fecha_entrada");
                Timestamp fechaSalida = res.getTimestamp("fecha_salida");
                RegistroAcceso registro = new RegistroAccesoImp(new VehiculoImp(matricula), new AccesoImp(nombre), fechaEntrada);
                registro.setFechaSalida(fechaSalida);
                registros.add(registro);
            }
        } finally {
            Persistencia.closeConnection();
        }
        return registros;
    }
}
